package compilador.lexico;

import java.util.Enumeration;
import java.util.Hashtable;

public class TablaSimbolos {
	Hashtable<String,String> TS;
	Hashtable<String, String> Tipos;
	Hashtable<String, String> Limites;
	Enumeration<String> e;
	private String ultima_agregada;
	
	public TablaSimbolos(){
		TS = new Hashtable<String, String>();
		Tipos = new Hashtable<String, String>();
		Limites = new Hashtable<String, String>();
		e = null;    //e = TS.keys();
	}
	
	public void agregarSimbolo (String id, String valor){
		TS.put(valor, id);
		if (id.equals("Identificador"))
			ultima_agregada = valor;
	}
	
	public void agregarSimbolo_Limite(String id, String valor){
		Limites.put(valor, id);
	}
	
	public void agregarTipo(String valor, String tipo){
		Tipos.put(valor, tipo);
	}
	
	public void agregarLimites(String valor, String limiteinf, String limitesup){
		Limites.put(valor, limiteinf+"."+limitesup);
	}
	
	public boolean contieneSimbolo(String valor){
		return (TS.containsKey(valor));
	}
	
	public boolean esPalabraReservada(String valor){
		if (valor.equals("if"))	return true;
		else if (valor.equals("else")) return true;
		else if (valor.equals("for")) return true;
		else if (valor.equals("print")) return true;
		else if (valor.equals("uint")) return true;
		else if (valor.equals("ulong")) return true;
		else return false;
	}

	public boolean hasMoreElement(){
		if (e == null) {
			e = TS.keys();
		}
		return e.hasMoreElements();
	}
	
	public String nextElement(){
		return (String) e.nextElement();
	}
	
	public String getId(String valor){
		return (String)TS.get(valor);
	}
	
	public String getId_Limite(String valor){
		return null;
	}
	
	public String getTipo(String valor){
		return(String)Tipos.get(valor);
	}
	
	public String getLimiteInferior(String valor){
		String val = (String)Limites.get(valor);
		return (val.substring(0, val.indexOf(".")));
	}
	
	public String getLimiteSuperior(String valor){
		String val = (String)Limites.get(valor);
		return (val.substring(val.indexOf(".")+1,val.length()));
	}
	
	public boolean esUltimaAgregada(String valor){
		return (valor.equals(ultima_agregada));
	}
	
	public void set_ultimaAgregada(String valor){
		this.ultima_agregada = valor; 
	}
	
	public void reset_enumeration(){
		e = TS.keys();
	}
}
